package com.zy.ems.common.base;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.zy.ems.common.exception.BusinessException;
import com.zy.ems.common.util.ResultTool;
import com.zy.ems.common.util.StringUtils;
import com.zy.ems.common.util.TokenUtils;
import com.zy.ems.utils.enums.Constant;
import com.zy.ems.utils.enums.UserTypeEnum;

/**
 * 基础控制器抽象类。
 * 
 * <ul>
 * <li>统一异常处理；
 * <li>统一数据返回格式
 * </ul>
 * 
 * @author Luffy
 *
 */
public abstract class BaseController {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 异常统一处理。
     */
    @ExceptionHandler
    @ResponseBody
    public Object handleException(HttpServletRequest request, Exception ex) {
        // root cause
        Throwable rootCause = ExceptionUtils.getRootCause(ex);
        // 记录最终需要处理的异常
        Throwable handleEx = rootCause != null ? rootCause : ex;
        // 日志记录，业务异常日志警告
        if (handleEx instanceof BusinessException) {
            logger.warn(handleEx.toString());
        }
        else {
            // 非业务异常报警处理
            logger.error(handleEx.getMessage(), handleEx);
        }
        // 统一错误返回格式
        return ResultTool.error(handleEx);
    }

    /**
     * 检测登录Token
     * 
     * @return
     */
    protected boolean checkToken(HttpServletRequest request) {
        String userId = request.getParameter(Constant.USERID);
        String mobile = request.getParameter(Constant.MOBILE);
        String accessToken = request.getParameter(Constant.ACCESS_TOKE);

        if (StringUtils.isEmpty(userId, mobile, accessToken)) {
            return false;
        }

        return TokenUtils.checkToken(userId, mobile, accessToken,
                UserTypeEnum.MEMBER);
    }
}
